package com.wongoing.base;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.wongoing.redis.AbstractBaseRedisDao;


/**
 * 功能说明 ：业务抽象基类，用于封装基础业务
 * 修改说明
 * @author 郑立兵
 * @date 2017-03-22 上午11:47:54
 * @version V1.0
 */
public class BaseServiceImpl<T> extends AbstractBaseRedisDao<String,T> implements BaseService<T, Serializable> {

	private BaseDao<T, Serializable> dao;
	
	public void setDao(BaseDao<T, Serializable> dao) {
		this.dao = dao;
	}
	/**
	 * 功能说明：按主键查询-单值主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:43:05
	 * @param id 主键值
	 * @return	返回对应的实体对象
	 */
	public T getByPrimaryKey(Serializable id) {
		return this.dao.getByPrimaryKey(id);
	}
	/**
	 * 功能说明：按主键查询-组合主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:44:41
	 * @param param 组合主键参数，可以是实体对象，可以是map
	 * @return 返回对应的实体对象
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public T getByPrimaryKeys(Object param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		return this.dao.getByPrimaryKeys(param);
	}
	/**
	 * 功能说明：参数查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:46:06
	 * @param param 查询参数，可以是实体对象，可以是map
	 * @return 返回符合条件的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getByParam(Object param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		return this.dao.getByParam(param);
	}
	/**
	 * 功能说明：按参数排序查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:23:44
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @param param 查询参数
	 * @return 返回符合要求且排好序的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getByParamAndOrder(String order, String orderTurn, Map<String, Object> param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		param.put("orderColumn", order);
		param.put("orderTurn", orderTurn);
		return this.dao.getByParam(param);
	}
	/**
	 * 功能说明：按参数查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:25:46
	 * @param offset 偏移量
	 * @param top 限定返回结果的记录数
	 * @param param 查询参数
	 * @return 返回符合要求的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getTopByParam(int offset, int top, Map<String, Object> param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		param.put("offset", offset);
		param.put("limit", top);
		return this.dao.getByParam(param);
	}
	/**
	 * 功能说明：按参数查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:30:13
	 * @param top 限定返回结果的记录数
	 * @param param 查询参数
	 * @return 返回符合要求的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getTopByParam(int top, Map<String, Object> param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		return this.getTopByParam(0, top, param);
	}
	/**
	 * 功能说明：按参数排序查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:30:56
	 * @param offset 偏移量
	 * @param top 限定返回结果的记录数
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @param param 查询参数
	 * @return 返回符合要求的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getTopByParamAndOrder(int offset, int top, String order, String orderTurn, Map<String, Object> param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		param.put("offset", offset);
		param.put("limit", top);
		param.put("orderColumn", order);
		param.put("orderTurn", orderTurn);
		return this.dao.getByParam(param);
	}
	/**
	 * 功能说明：按参数排序查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:36:33
	 * @param top 限定返回结果的记录数
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @param param 查询参数
	 * @return 返回符合要求的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getTopByParamAndOrder(int top, String order, String orderTurn, Map<String, Object> param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		return this.getTopByParamAndOrder(0, top, order, orderTurn, param);
	}
	/**
	 * 功能说明：按Mapper文件中的语句ID和参数查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:47:05
	 * @param statementId Mapper文件中的语句ID
	 * @param param 查询参数
	 * @return 返回符合条件的实体集合
	 */
//	public List<T> getByStatementParam(String statementId, Map<String, Object> param) {
//		return this.dao.getByStatementParam(statementId, param);
//	}
	/**
	 * 功能说明：按参数分页查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:49:02
	 * @param pageResult 带查询参数的分页对象，需在pageResult中传入pageIndex、pageSize、param
	 * @return 返回带结果数据的分页实体对象，在pageResult中返回totalSize、pageCount、data
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public PageResult<T> getPageByParam(PageResult<T> pageResult) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		pageResult.getParam().put("offset", pageResult.getPageSize() * (pageResult.getPageCurrent() - 1));
		pageResult.getParam().put("limit", pageResult.getPageSize());
		if (!"".equals(pageResult.getOrderField())) { pageResult.getParam().put("orderColumn", pageResult.getOrderField()); }
		pageResult.getParam().put("orderTurn", pageResult.getOrderDirection());
		List<T> data = dao.getByParam(pageResult.getParam());
		pageResult.setList(data);
		int totalSize = dao.countByParam(pageResult.getParam());
		pageResult.setTotal(totalSize);
		return pageResult;
	}
	/**
	 * 功能说明：查询所有记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-27 下午5:14:43
	 * @return 返回对应所有记录的实体集合
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getAll() throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		return this.dao.getByParam(null);
	}
	/***
	 * 功能说明：查询所有记录并排序
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-27 下午5:17:47
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @return 返回排好序的所有记录
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public List<T> getAllAndOrder(String order, String orderTurn) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		Map<String, Object> param = new HashMap<String, Object>();
		param.put("orderColumn", order);
		param.put("orderTurn", orderTurn);
		return this.dao.getByParam(param);
	}
	/**
	 * 功能说明：条件查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:52:51
	 * @param whereParam 查询条件，需要在map中增加key为where的键值对作为查询条件字符串（不带where关键词）
	 * @return 返回符合条件的实体集合
	 */
	public List<T> getByWhere(Map<String, Object> whereParam) {
		return this.dao.getByWhere(whereParam);
	}
	/**
	 * 功能说明：按条件查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:38:28
	 * @param where 条件字符串（不包含where关键词）
	 * @return 返回符合要求的实体集合
	 */
	public List<T> getByWhere(String where) {
		Map<String, Object> whereParam = new HashMap<String, Object>();
    	whereParam.put("where", where);
		return this.dao.getByWhere(whereParam);
	}
	/** 
	 * 功能说明：按条件排序查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:41:44
	 * @param where 条件字符串（不包含where关键词）
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @return 返回符合要求的实体集合
	 */
	public List<T> getByWhereAndOrder(String where, String order, String orderTurn) {
		Map<String, Object> whereParam = new HashMap<String, Object>();
    	whereParam.put("where", where);
    	whereParam.put("orderColumn", order);
    	whereParam.put("orderTurn", orderTurn);
		return this.dao.getByWhere(whereParam);
	}
	/**
	 * 功能说明：按条件查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:43:11
	 * @param offset 偏移量
	 * @param top 限定返回结果的记录数
	 * @param where 条件字符串（不包含where关键词）
	 * @return 返回符合要求的实体集合
	 */
	public List<T> getTopByWhere(int offset, int top, String where) {
		Map<String, Object> whereParam = new HashMap<String, Object>();
    	whereParam.put("where", where);
    	whereParam.put("offset", offset);
    	whereParam.put("limit", top);
		return this.dao.getByWhere(whereParam);
	}
	/**
	 * 功能说明：按条件查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:47:24
	 * @param top 限定返回结果的记录数
	 * @param where 条件字符串（不包含where关键词）
	 * @return 返回符合要求的实体集合
	 */
	public List<T> getTopByWhere(int top, String where) {
		Map<String, Object> whereParam = new HashMap<String, Object>();
    	whereParam.put("where", where);
    	whereParam.put("offset", 0);
    	whereParam.put("limit", top);
		return this.dao.getByWhere(whereParam);
	}
	/**
	 * 功能说明：按条件排序查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:48:36
	 * @param offset 偏移量
	 * @param top 限定返回结果的记录数
	 * @param where 条件字符串（不包含where关键词）
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @return 返回符合要求的实体集合
	 */
	public List<T> getTopByWhereAndOrder(int offset, int top, String where, String order, String orderTurn) {
		Map<String, Object> whereParam = new HashMap<String, Object>();
    	whereParam.put("where", where);
    	whereParam.put("orderColumn", order);
    	whereParam.put("orderTurn", orderTurn);
    	whereParam.put("offset", offset);
    	whereParam.put("limit", top);
    	return this.dao.getByWhere(whereParam);
	}
	/**
	 * 功能说明：按条件排序查询前top条记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午2:51:32
	 * @param top 限定返回结果的记录数
	 * @param where 条件字符串（不包含where关键词）
	 * @param order 排序字段
	 * @param orderTurn 排序方向，asc or desc
	 * @return 返回符合要求的实体集合
	 */
	public List<T> getTopByWhereAndOrder(int top, String where, String order, String orderTurn) {
		return this.getTopByWhereAndOrder(0, top, where, order, orderTurn);
	}
	/**
	 * 功能说明：按条件分页查询
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 上午11:54:44
	 * @param pageResult 带查询条件的分页对象，需在pageResult中传入pageIndex、pageSize、where
	 * @return 返回带结果数据的分页实体对象，在pageResult中返回totalSize、pageCount、data
	 */
	public PageResult<T> getPageByWhere(PageResult<T> pageResult) {
		return this.dao.getPageByWhere(pageResult);
	}
	/**
	 * 功能说明：查询记录数
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:15:48
	 * @return 返回表中记录总数
	 */
	public int count() {
		return this.dao.count();
	}
	/**
	 * 功能说明：按参数查询记录数
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:19:47
	 * @param param 参数，可以是实体对象，可以是map
	 * @return 返回符合参数值的记录数
	 */
	public int countByParam(Map<String, Object> param) {
		return this.dao.countByParam(param);
	}
	/**
	 * 功能说明：按条件查询记录数
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:22:00
	 * @param where 条件，条件字符串中不包括where关键词
	 * @return
	 */
	public int countByWhere(String where) {
		return this.dao.countByWhere(where);
	}
	/**
	 * 功能说明：追加记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:25:31
	 * @param entity 实体对象
	 * @return 返回追加的记录数
	 */
	public int insert(T entity) {
		return this.dao.insert(entity);
	}
	/**
	 * 功能说明：批量追加记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:26:39
	 * @param list 实体对象集合
	 * @return 返回追加的记录数
	 */
	public int insertBatch(List<T> list) {
		return this.dao.insertBatch(list);
	}
	/**
	 * 功能说明：按主键更新
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:28:06
	 * @param entity 要更新的实体对象
	 * @return 返回更新的记录数
	 */
	public int updateByPrimaryKey(T entity) {
		return this.dao.updateByPrimaryKey(entity);
	}
	/**
	 * 功能说明：批量更新
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:29:36
	 * @param list 要更新的实体对象集合
	 * @return 返回更新的记录数
	 */
	public int updateBatch(List<T> list) {
		return this.dao.updateBatch(list);
	}
	/**
	 * 功能说明：按主键删除-单值主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:37:04
	 * @param id 主键值
	 * @return 返回删除的记录数
	 */
	public int deleteByPrimaryKey(Serializable id) {
		return this.dao.deleteByPrimaryKey(id);
	}
	/**
	 * 功能说明：按主键删除-组合主键
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:37:56
	 * @param param 组合主键值，可以是实体对象，也可以是map
	 * @return 返回删除的记录数
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public int deleteByPrimaryKeys(Object param) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
		return this.dao.deleteByPrimaryKeys(param);
	}
	/**
	 * 功能说明：按参数删除记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:39:34
	 * @param param 参数
	 * @return 返回删除的记录数
	 */
	public int deleteByParam(Map<String, Object> param) {
		return this.dao.deleteByParam(param);
	}
	/**
	 * 功能说明：批量删除
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:42:03
	 * @param ids 要删除的主键值集合
	 * @return 返回删除的记录数
	 */
	public int deleteBatch(List<Serializable> ids) {
		return this.dao.deleteBatch(ids);
	}
	/**
	 * 功能说明：按条件删除记录
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:43:08
	 * @param where 条件字符串（不包含where关键词）
	 * @return 返回删除的记录数
	 */
	public int deleteByWhere(String where) {
		return this.dao.deleteByWhere(where);
	}
	/**
	 * 功能说明：清空表中记录，即截断表（truncate）
	 * 修改说明：
	 * @author 郑立兵
	 * @date 2017-3-23 下午1:45:48
	 */
	public void clean() {
		this.dao.clean();
	}
}
